import Vue from 'vue'

// 建议使用环境变量配置baseUrl
const baseUrl = process.env.VUE_APP_BASE_API || 'http://47.115.203.245';

// 获取本地存储的token和openid（假设使用uni存储）
const getAuthInfo = () => {
  try {
    return {
      isLogin: uni.getStorageSync('chamberlain_login_status'),
      openid: uni.getStorageSync('chamberlain_openid')
    }
  } catch (e) {
    return { isLogin: null, openid: null }
  }
}

const request = (options) => {
  // 参数合并与默认值处理
  const config = {
    method: 'GET',
    needLogin: false,    // 默认不需要token
    needOpenid: false,   // 默认不需要openid
    showLoading: false,
    header: {},
    ...options
  }

  let url = baseUrl + config.url;
  const { isLogin, openid } = getAuthInfo();

  // 加载状态处理
  if (config.showLoading) {
    uni.showLoading({ title: '加载中...', mask: true });
  }

  // 请求拦截：添加认证信息
  if (config.needLogin && isLogin) {
    config.header.Authorization = `Bearer ${isLogin}`;
  }

  // 处理openid逻辑
  if (config.needOpenid && openid) {
    if (config.method === 'GET') {
      config.params = { ...config.params, openid };
    } else {
      config.data = { ...config.data, openid };
    }
  }

  // 处理GET参数
  if (config.method === 'GET' && config.params) {
    const paramsStr = Object.keys(config.params)
      .map(key => `${encodeURIComponent(key)}=${encodeURIComponent(config.params[key])}`)
      .join('&');
    url += url.includes('?') ? `&${paramsStr}` : `?${paramsStr}`;
  }

  return new Promise((resolve, reject) => {
    uni.request({
      url,
      method: config.method,
      data: config.method !== 'GET' ? config.data : undefined,
      header: {
        'Content-Type': 'application/json',
        ...config.header
      },
      timeout: 10000, // 添加超时设置
      success: (res) => {
        console.log('响应拦截器',res)
        // 响应拦截器
        if (res.statusCode === 200) {
          // 根据业务代码处理（假设0表示成功）
          if (res.data.code === 200) {
            resolve(res.data)
          } else {
            // 自动处理token过期等通用逻辑
            if (res.data.code === 401) {
              uni.removeStorageSync('isLogin')
              uni.reLaunch({ url: '/pages/login/login' })
            }
            reject(res.data || new Error(`业务错误：${res.data.msg}`))
          }
        } else {
          reject(new Error(`请求失败，状态码：${res.statusCode}`))
        }
      },
      fail: (err) => {
        reject(new Error(`网络错误：${err.errMsg || '未知错误'}`))
      },
      complete: () => {
        config.showLoading && uni.hideLoading()
      }
    })
  })
}

// 添加快捷方法
const createMethod = (method) => (url, data, options) => 
  request({ url, method, data, ...options })

request.get = createMethod('GET')
request.post = createMethod('POST')
request.put = createMethod('PUT')
request.delete = createMethod('DELETE')

export default request